/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package PanelesDeTrabajo;

import com.google.gson.Gson;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import net.miginfocom.swing.MigLayout;

/**
 *
 * @author hp
 */
public class MapaRestaurant extends JPanel implements ActionListener, MouseListener, MouseMotionListener, KeyListener
{
    private JPanel panelMapa;
    private JPanel panelOpcionesMapa;
    private JButton agregadoEstandar;
    private JButton cargarPlano;
    private JButton aceptar;
    private JLabel numMesas;
    private JLabel labelCargarPlano;
    public int numeroMesas = 0;
    private int xMouse = 0;
    private int yMouse = 0;
    private int indiceMesa = 0;
    private boolean soltarClick = false;
    private JTextField textField;
    private ArrayList<Mesa> mesas = new ArrayList<Mesa>();
    private ImageIcon iconPlano;
    private ImageIcon iconMesa;
    private Gson gson;
    
    public MapaRestaurant()
    {
        this.setLayout(new BorderLayout());
        this.panelOpcionesMapa = new JPanel();
        this.panelOpcionesMapa.setLayout(new MigLayout());
        
        this.iconMesa = new ImageIcon("src/Resource/mesa_restaurante.PNG");
        redimensionarMesa();
        
        this.panelMapa = new JPanel();
        this.panelMapa.setBackground(Color.black);
        
        this.agregadoEstandar = new JButton("Agregado Estándar");
        this.cargarPlano = new JButton("Examinar");
        this.aceptar = new JButton("Aceptar");
        
        this.textField = new JTextField(5);
        this.textField.setText("0");
        
        this.numMesas = new JLabel("N° mesas:");
        this.labelCargarPlano = new JLabel("Cargar Plano:");
        
        this.panelOpcionesMapa.add(labelCargarPlano);
        this.panelOpcionesMapa.add(cargarPlano);
        this.panelOpcionesMapa.add(numMesas);
        this.panelOpcionesMapa.add(textField);
        this.panelOpcionesMapa.add(aceptar);
        
        this.agregadoEstandar.addActionListener(this);
        this.cargarPlano.addActionListener(this);
        this.aceptar.addActionListener(this);
        this.textField.addKeyListener(this);
        
        this.add(panelOpcionesMapa, BorderLayout.NORTH);
        this.add(panelMapa, BorderLayout.CENTER);
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }
    
    public void paint(Graphics g)
    {
        super.paint(g);
        pintarPlano(g);
        
        if (numeroMesas > 0)
        {
            pintarAgregadoEstandar(g);
        }
        repaint();
        updateUI();
    }
    
    public void pintarPlano(Graphics g)
    {
        if (iconPlano != null)
        {
            redimensionarPlano();
            g.drawImage(iconPlano.getImage(), 0, 25, this);
        }
    }
    
    public void agregarMesas()
    {   
        int puntoX = 50;
        int puntoY = 50;
        int ancho = 30;
        int alto = 30;
        
        for (int i=0; i<numeroMesas; i++)
        {
            if ((puntoX + ancho) <= 750 && (puntoY + alto) <= 500)
            {
                Mesa mesa = new Mesa(puntoX, puntoY, ancho, alto, i);
                mesas.add(mesa);
                puntoX  = puntoX + 80; //Separación entre mesas
            }
            else
            {
                puntoX = 50; //Reposicionamiento mesa en punto X
                puntoY = puntoY + 70; //Reposicionamiento mesa en punto Y
                Mesa mesa = new Mesa(puntoX, puntoY, ancho, alto, i);
                mesas.add(mesa);
                puntoX = puntoX +80;
            }
        }
        if (numeroMesas != 0)
        {
            this.agregadoEstandar.setEnabled(false);
        }
    }
    
    public void pintarAgregadoEstandar(Graphics g)
    {
        for (int i=0; i<numeroMesas; i++)
        {
            int puntoX = mesas.get(i).getX();
            int puntoY = mesas.get(i).getY();
            g.drawImage(iconMesa.getImage(), puntoX, puntoY, this);
        }
    }
    
//    public void seleccionarMesa(int xMouse, int yMouse, Graphics g)
//    {
//        for (int i=0; i<mesas.size(); i++) //Recorremos el arraylist 'mesas' para verificar si hicimos click sobre una mesa.
//        {
//            int xMesa = mesas.get(i).getX();
//            int yMesa = mesas.get(i).getY();
//            int anchoMesa = mesas.get(i).getAncho();
//            int altoMesa = mesas.get(i).getAlto();
//            
//            if ((xMouse >= xMesa) && (xMouse <= (xMesa + anchoMesa)) && (yMouse >= yMesa) && (yMouse <= (yMesa + altoMesa))) //Hicimos click sobre una mesa?
//            {
//                g.setColor(Color.blue);
//                g.fillRect(xMesa-5, yMesa-5, anchoMesa+5, altoMesa+5); //1° pintamos de azul un cuadrado mas grande, luego repintamos el verde un poco más pequeño. Que parezca como "seleccionado".
//                g.setColor(Color.green);
//                g.fillRect(xMesa, yMesa, anchoMesa-5, altoMesa-5);
//            }
//        }
//    }
    
    public boolean hayMesa()
    {
        for (int i=0; i<mesas.size(); i++) //Recorremos el arraylist 'mesas' para verificar si hicimos click sobre una mesa.
        {
            int xMesa = mesas.get(i).getX();
            int yMesa = mesas.get(i).getY();
            int anchoMesa = mesas.get(i).getAncho();
            int altoMesa = mesas.get(i).getAlto();
            
            if ((xMouse >= xMesa) && (xMouse <= (xMesa + anchoMesa)) && (yMouse >= yMesa) && (yMouse <= (yMesa + altoMesa))) //Hicimos click sobre una mesa?
            {
                indiceMesa = i;
                return true;
            }
        }
        return false;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) throws NumberFormatException
    {
        Object click = e.getSource();
        
        if (click == aceptar)
        {
            mesas.clear();
            String stringNum = textField.getText();
            
            if (stringNum.equals(""))
            {
                JOptionPane.showMessageDialog(this, "No puede quedar vacío éste campo, por favor ingrese número de mesas");
                textField.setText("0");
            }
            else
            {
                try
                {
                    int numero = Integer.parseInt(stringNum);
            
                    if (numero > 0)
                    {
                        setNumeroMesas(numero);
                        agregarMesas();
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(this, "Número de mesas inválido, por favor ingrese un número mayor a cero");
                    }
                }
                catch (NumberFormatException nfe)
                {
                    JOptionPane.showMessageDialog(null, "No puede escribir decimales ni puntuación, solo valores numéricos enteros mayores que cero!", "Error de entrada",JOptionPane.ERROR_MESSAGE);
                }
                
            } 
        }
        
        if (click == cargarPlano)
        {
            JFileChooser fileChooser = new JFileChooser();
            FileNameExtensionFilter filtroImagen = new FileNameExtensionFilter("JPG & PNG", "jpg","png");
            fileChooser.setFileFilter(filtroImagen);
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            fileChooser.setAcceptAllFileFilterUsed(false);
            int returnValue = fileChooser.showOpenDialog(null);// Nos retorna un entero
                
          // Si apretamos en aceptar un archivo ocurrira esto
            if (returnValue == JFileChooser.APPROVE_OPTION)
            {
                File selectedFile = fileChooser.getSelectedFile();  
                String direccion = selectedFile.getAbsolutePath();
                iconPlano = new ImageIcon(direccion);
            } 
        }
    }
    
    @Override
    public void mouseClicked(MouseEvent e) 
    {
        
    }

    @Override
    public void mousePressed(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) 
    {
       soltarClick = true;
       
       if (soltarClick)
       {
           if (e.getX() >= 5 && (e.getX()+30) <= this.getWidth() && e.getY() >= 5 && (e.getY()+30) <= this.getHeight())
           {
                mesas.get(indiceMesa).setX(e.getX());
                mesas.get(indiceMesa).setY(e.getY());
           }
       }
    }

    @Override
    public void mouseEntered(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
        
    }
    
    @Override
    public void mouseDragged(MouseEvent e) 
    {
        setPuntoMouse(e.getX(), e.getY());
        
        if (hayMesa())
        {
            int xNuevo = e.getX(); //Posicion X futura cuadrado
            int yNuevo = e.getY(); //Posicion Y futura cuadrado
            
            int xViejo = mesas.get(indiceMesa).getX(); //Posicion X inicial cuadrado
            int yViejo = mesas.get(indiceMesa).getY(); //Posicion Y inicial cuadrado
            int ancho = mesas.get(indiceMesa).getAncho();
            int alto = mesas.get(indiceMesa).getAlto();
            
            if (xNuevo >= 5 && (xNuevo+ancho) <= this.getWidth() && yNuevo >= 5 && (yNuevo+alto) <= this.getHeight())
            {
                soltarClick = false;
            }
        }
    }

    @Override
    public void mouseMoved(MouseEvent e) 
    {
        
    }
    
    @Override
    public void keyTyped(KeyEvent e) 
    {
        int key = (int)e.getKeyChar();
        
        if ((key >= 97 && key <= 122) || (key >= 65 && key <= 90))
        {
            e.consume();
            JOptionPane.showMessageDialog(null, "No puede ingresar letras, solo valores numéricos!", "Error de entrada",JOptionPane.ERROR_MESSAGE);
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
    }
    
    public void setPuntoMouse(int xMouse, int yMouse)
    {
        this.xMouse = xMouse;
        this.yMouse = yMouse;
        repaint(); //Repintamos para ir actualizando de inmediato nuestro mapa y los datos.
    }
    
    public void setXMouse(int xMouse)
    {
        this.xMouse = xMouse;
    }
    
    public void setYMouse(int yMouse)
    {
        this.yMouse = yMouse;
    }
    
    public void setNumeroMesas(int numero)
    {
        this.numeroMesas = numero;
        repaint(); //Repintamos para actualizar nuestro numero de mesas colocadas en el mapa.
    }
    
    void recibirNumeroMesas(String numeroMesas)
    {
        this.numeroMesas = Integer.parseInt(numeroMesas);
    }

    public void redimensionarPlano()
    {
        Image image = iconPlano.getImage().getScaledInstance(this.getWidth()+5, this.getHeight()-15, Image.SCALE_DEFAULT);
        iconPlano.setImage(image);
    }
    
    public void redimensionarMesa()
    {
        Image image = iconMesa.getImage().getScaledInstance(40, 40, Image.SCALE_DEFAULT);
        iconMesa.setImage(image);
    }
}